跳到主要内容

CMake 的编译目标

编译目标

在 CMake 中,编译目标主要指的是项目中要生成的执行文件、库文件等。这些目标是通过 add_executable、add_library 等命令定义的。编译目标让 CMake 知道如何将源代码文件编译链接成最终的可执行文件或库。

编译目标的定义允许 CMake 管理和优化整个构建过程,包括:

  • 确定哪些源文件属于哪个目标。
  • 处理目标之间的依赖关系。
  • 配置目标的编译选项、定义宏等。
  • 确定链接时需要包含哪些库。

CMake是一个跨平台的自动化构建系统,它使用文本文件(通常命名为CMakeLists.txt)来定义项目的构建环境。在CMake中,你可以定义多种编译目标,包括可执行文件、静态库和动态库。

常用的定义编译目标的操作

可执行文件 (add_executable)

使用add_executable命令来定义一个可执行文件的编译目标。你需要指定可执行文件的名称和构成该可执行文件的源文件。

静态库 (add_library...STATIC)

使用add_library命令并指定STATIC关键字来定义一个静态库的编译目标。静态库在程序链接时会被完整地复制到最终的可执行文件中。

动态库/共享库 (add_library...SHARED)

使用add_library命令并指定SHARED关键字来定义一个动态库(或称为共享库)的编译目标。动态库在程序运行时被载入。

模块库 (add_library...MODULE)

用于创建一个在运行时通过dlopen在应用程序中动态加载的库,而不是在应用程序启动时链接。

接口库 (add_library...INTERFACE)

用于仅仅定义接口,它不编译成实际的文件,但可以携带使用需求,供其他目标链接使用。

添加一个可执行文件

cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(MyExecutableProject)

# 定义一个可执行文件“MyExecutable”及其所需的源文件
add_executable(MyExecutable main.cpp)

添加一个静态库

cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(MyStaticLibraryProject)

# 定义一个静态库“MyStaticLib”及其源文件
add_library(MyStaticLib STATIC library.cpp library.h)

添加一个动态库

cmake_minimum_required(VERSION 3.10)

# 设置项目名称
project(MySharedLibraryProject)

# 定义一个动态库“MySharedLib”及其源文件
add_library(MySharedLib SHARED library.cpp library.h)

在这些例子中,cmake_minimum_required 指令用来指定CMake的最低版本要求,project 命令用于定义项目的名称,而 add_executableadd_library 则分别用于定义可执行文件和库的编译目标。

Install 目标

install 用于指定在安装时运行的规则。它可以用来安装很多内容,可以包括目标二进制、动态库、静态库以及文件、目录、脚本等

提示

CMake 项目中可以没有 install 命令。使用 install 命令是为了定义如何安装(即将构建好的目标文件、库文件、头文件等复制到系统的指定位置)你的项目或库,这对于最终用户来说非常重要,因为它简化了软件的部署和分发过程。然而,如果你的项目仅仅是为了开发或内部使用,或者不需要安装到系统的特定位置,那么可以不使用 install 命令。

install(TARGETS <target>... [...])
install({FILES | PROGRAMS} <file>... [...])
install(DIRECTORY <dir>... [...])
install(SCRIPT <file> [...])
install(CODE <code> [...])
install(EXPORT <export-name> [...])

参数中的 TARGET 可以是很多种目标文件,最常见的是通过 ADD_EXECUTABLE 或者 ADD_LIBRARY 定义的目标文件,即可执行二进制、动态库、静态库:

| 目标文件       | 内容                    | 安装目录变量                | 默认安装文件夹 |
| -------------- | ----------------------- | --------------------------- | -------------- |
| ARCHIVE | 静态库 | ${CMAKE_INSTALL_LIBDIR} | lib |
| LIBRARY | 动态库 | ${CMAKE_INSTALL_LIBDIR} | lib |
| RUNTIME | 可执行二进制文件 | ${CMAKE_INSTALL_BINDIR} | bin |
| PUBLIC_HEADER | 与库关联的PUBLIC头文件 | ${CMAKE_INSTALL_INCLUDEDIR} | include |
| PRIVATE_HEADER | 与库关联的PRIVATE头文件 | ${CMAKE_INSTALL_INCLUDEDIR} | include |

Reference